package tools;



import notify.NotifyTest;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.file.*;

public class PathUtil {

    /**
     * 获取当前运行的目录
     * @return
     */
    public static String getRunPath(){
        /**
         * 方法一：获取当前可执行jar包所在目录
         */
        String filePath = System.getProperty("java.class.path");
        String pathSplit = System.getProperty("path.separator");//得到当前操作系统的分隔符，windows下是";",linux下是":"
        /**
         * 若没有其他依赖，则filePath的结果应当是该可运行jar包的绝对路径，
         * 此时我们只需要经过字符串解析，便可得到jar所在目录
         */
        if(filePath.contains(pathSplit)){
            filePath = filePath.substring(0,filePath.indexOf(pathSplit));
        }else if (filePath.endsWith(".jar")) {//截取路径中的jar包名,可执行jar包运行的结果里包含".jar"
            filePath = filePath.substring(0, filePath.lastIndexOf(File.separator) + 1);
        }
        return filePath;
    }

    public static String getJarPath(Class caa){
        /**
         * 方法二：获取当前可执行jar包所在目录
         */
        String filePath = "";
        URL url = caa.getProtectionDomain().getCodeSource().getLocation();
        try {
            filePath = URLDecoder.decode(url.getPath(), "utf-8");// 转化为utf-8编码，支持中文
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (filePath.endsWith(".jar")) {// 可执行jar包运行的结果里包含".jar"
            // 获取jar包所在目录
            filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
        }

        File file = new File(filePath);
        filePath = file.getAbsolutePath();//得到windows下的正确路径
        return filePath;
    }

    public static String getExePath() throws IOException {
        return new File("").getAbsolutePath();
    }

    public static void listenFiles(Path path) throws IOException, InterruptedException {
        //创建一个文件系统的监听服务
        WatchService watchService= FileSystems.getDefault().newWatchService();

//        Path path= Paths.get("D:/test");
        /*如果目录不存在则新建*/
        File file =new File(String.valueOf(path)); //如果文件夹不存在则创建
        if (!file.exists() && !file.isDirectory()) {
            System.out.println("//不存在");
            file.mkdir();
        } else {
            System.out.println("目录存在");
        }


        //为该文件夹注册监听,监听新建、修改、删除事件。只能为文件夹（目录）注册监听，不能为单个文件注册监听
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE/*,StandardWatchEventKinds.ENTRY_MODIFY,StandardWatchEventKinds.ENTRY_DELETE*/);
        //编写事件处理
        while (true){ //一直监听
            //拉取一个WatchKey。当触发监听的事件时，就会产生一个WatchKey，此WatchKey封装了事件信息。
            WatchKey watchKey=watchService.take();
            //使用循环是因为这一个WatchKey中可能有多个文件变化了，比如Ctrl+A全选，然后删除，只触发了一个WatchKey，但有多个文件变化了
            for (WatchEvent event:watchKey.pollEvents()){
//                System.out.println(event.count());
                System.out.println(event.context()+"发生了"+event.kind()+"事件！");
                NotifyTest.doNotifyNc("提示【点击弹窗任意区域可关闭】","已发送给您["+event.context()+"]文件请及时查看","dialog-information.png");
        /*
        watchKey.pollEvents() 获取此次WatchKey中所有变化了的文件的信息，以List（列表）形式返回，一个WatchEvent就是一个元素，封装了一个变化了的文件的信息
        event.context() 获取文件名
        event.kind() 获取发生的事件类型
        因为只能为文件夹注册监听，如果要监听某些指定的文件，可以在增强的for循环中，先根据event.context()判断是否是指定的文件，是才处理。
         */
            }
            //虽然是while()循环，但WatchKey和ByteBuffer一样，使用完要重置状态，才能继续用。
            watchKey.reset();  //如果不重置，WatchKey使用一次过后就不能再使用，即只能监听到一次文件变化。
        }
    /*
    测试：在D:/untitled/test目录下
    1、新建1.txt文件   1.txt.txt发生了ENTRY_CREATE事件！
    2、打开1.txt，输入"hello world!",并保存   1.txt.txt发生了ENTRY_MODIFY事件！
    3、删除“hello world!",并保存   1.txt.txt发生了ENTRY_MODIFY事件！
    4、新建2.txt文件  2.txt发生了ENTRY_CREATE事件！
    说明：编辑文件内容时，不算修改，保存时才算修改。
    5、新建文件夹“图片”
      新建文件夹发生了ENTRY_CREATE事件！
      新建文件夹发生了ENTRY_DELETE事件！
      图片发生了ENTRY_CREATE事件！
    OS执行过程：新建了一个名为“新建文件夹”的文件夹，再把此文件夹重命名为指定的名称。
    重命名时，”新建文件夹“消失了，算作删除，”图片“出现了，算作新建。
    6、在图片目录下，随便新建一个文件或者文件夹
      图片发生了ENTRY_MODIFY事件！
     说明监控的只是子文件、子文件夹，不会递归监控。
    7、全选，删除test下所有文件、子文件夹
      图片发生了ENTRY_DELETE事件！
      1.txt.txt发生了ENTRY_DELETE事件！
      2.txt发生了ENTRY_DELETE事件！
     */

        /*开始解析XML文件*/



    }

}
